<?php

namespace app\common\service;

use app\common\exception\MyException;
/**
 * Class WechatService
 * @package app\common\serivce
 *
 * @method \WeChat\Card WeChatCard() static 微信卡券管理
 * @method \WeChat\Custom WeChatCustom() static 微信客服消息
 * @method \WeChat\Limit WeChatLimit() static 接口调用频次限制
 * @method \WeChat\Media WeChatMedia() static 微信素材管理
 * @method \WeChat\Menu WeChatMenu() static 微信菜单管理
 * @method \WeChat\Oauth WeChatOauth() static 微信网页授权
 * @method \WeChat\Pay WeChatPay() static 微信支付商户
 * @method \WeChat\Product WeChatProduct() static 微信商店管理
 * @method \WeChat\Qrcode WeChatQrcode() static 微信二维码管理
 * @method \WeChat\Receive WeChatReceive() static 微信推送管理
 * @method \WeChat\Scan WeChatScan() static 微信扫一扫接入管理
 * @method \WeChat\Script WeChatScript() static 微信前端支持
 * @method \WeChat\Shake WeChatShake() static 微信揺一揺周边
 * @method \WeChat\Tags WeChatTags() static 微信用户标签管理
 * @method \WeChat\Template WeChatTemplate() static 微信模板消息
 * @method \WeChat\User WeChatUser() static 微信粉丝管理
 * @method \WeChat\Wifi WeChatWifi() static 微信门店WIFI管理
 *
 * ----- WeMini -----
 * @method \WeMini\Account WeMiniAccount() static 小程序账号管理
 * @method \WeMini\Basic WeMiniBasic() static 小程序基础信息设置
 * @method \WeMini\Code WeMiniCode() static 小程序代码管理
 * @method \WeMini\Domain WeMiniDomain() static 小程序域名管理
 * @method \WeMini\Tester WeMinitester() static 小程序成员管理
 * @method \WeMini\User WeMiniUser() static 小程序帐号管理
 * --------------------
 * @method \WeMini\Crypt WeMiniCrypt() static 小程序数据加密处理
 * @method \WeMini\Delivery WeMiniDelivery() static 小程序即时配送
 * @method \WeMini\Image WeMiniImage() static 小程序图像处理
 * @method \WeMini\Logistics WeMiniLogistics() static 小程序物流助手
 * @method \WeMini\Message WeMiniMessage() static 小程序动态消息
 * @method \WeMini\Ocr WeMiniOcr() static 小程序ORC服务
 * @method \WeMini\Plugs WeMiniPlugs() static 小程序插件管理
 * @method \WeMini\Poi WeMiniPoi() static 小程序地址管理
 * @method \WeMini\Qrcode WeMiniQrcode() static 小程序二维码管理
 * @method \WeMini\Security WeMiniSecurity() static 小程序内容安全
 * @method \WeMini\Soter WeMiniSoter() static 小程序生物认证
 * @method \WeMini\Template WeMiniTemplate() static 小程序模板消息支持
 * @method \WeMini\Total WeMiniTotal() static 小程序数据接口
 * @method \WeMini\Newtmpl WeMiniNewtmpl() static 小程序订阅消息支持
 *
 * ----- WePay -----
 * @method \WePay\Bill WePayBill() static 微信商户账单及评论
 * @method \WePay\Order WePayOrder() static 微信商户订单
 * @method \WePay\Refund WePayRefund() static 微信商户退款
 * @method \WePay\Coupon WePayCoupon() static 微信商户代金券
 * @method \WePay\Redpack WePayRedpack() static 微信红包支持
 * @method \WePay\Transfers WePayTransfers() static 微信商户打款到零钱
 * @method \WePay\TransfersBank WePayTransfersBank() static 微信商户打款到银行卡
 *
 * ----- WeOpen -----
 * @method \WeOpen\Login WeOpenLogin() static 第三方微信登录
 * @method \WeOpen\Service WeOpenService() static 第三方服务
 *
 * ----- ThinkService -----
 * @method mixed ThinkServiceConfig() static 平台服务配置
 */
class WechatService
{
    // $config = [
    //     'token'          => 'test',
    //     'appid'          => 'wx60a43dd8161666d4',
    //     'appsecret'      => '71308e96a204296c57d7cd4b21b883e8',
    //     'encodingaeskey' => 'BJIUzE0gqlWy0GxfPp4J1oPTBmOrNDIGPNav1YFH5Z5',
    //     // 配置商户支付参数（可选，在使用支付功能时需要）
    //     'mch_id'         => "1235704602",
    //     'mch_key'        => 'IKI4kpHjU94ji3oqre5zYaQMwLHuZPmj',
    //     // 配置商户支付双向证书目录（可选，在使用退款|打款|红包时需要）
    //     'ssl_key'        => '',
    //     'ssl_cer'        => '',
    //     // 缓存目录配置（可选，需拥有读写权限）
    //     'cache_path'     => '',
    // ];


    /**
     * 获取公众号配置参数
     * @return array
     */
    public function getConfig(): array
    {
        $options = [
            'appid'          => _conf('wechat.appid'),
            'token'          => _conf('wechat.token'),
            'appsecret'      => _conf('wechat.appsecret'),
            'encodingaeskey' => _conf('wechat.encodingaeskey'),
            'mch_id'         => _conf('wechat.mch_id'),
            'mch_key'        => _conf('wechat.mch_key'),
            'cache_path'     => runtime_path() . 'wechat',  // 目录不存在，sdk会自动创建
        ];
        switch (strtolower(_conf('wechat.mch_ssl_type'))) {
            case 'p12':
                $options['ssl_p12'] = _conf('wechat.mch_ssl_p12');
                break;
            case 'pem':
                $options['ssl_key'] = _conf('wechat.mch_ssl_key');
                $options['ssl_cer'] = _conf('wechat.mch_ssl_cer');
                break;
        }
        return $options;
    }

    /**
     * 获取当前微信APPID
     * @return string
     */
    public function getAppid(): string
    {
        if ($this->getType() === 'api') {
            return _conf('wechat.appid');
        } else {
            return _conf('wechat.thr_appid');
        }
    }

    /**
     * 获取接口授权模式
     * @return string
     */
    public function getType(): string
    {
        $type = strtolower(_conf('wechat.type'));
        if (in_array($type, ['api', 'thr'])) return $type;
        throw new MyException(['code' => 4001]);
    }

    
}